package controleur;

import java.io.IOException;
import java.util.ArrayList;

import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import modele.Config;
import modele.FacadeArticle;
import modele.FacadeMembre;
import modele.FacadeMenu;
import modele.FacadeSite;
import modele.InfoSession;
import modele.Notification;

/**
 * Servlet implementation class for Servlet: Membre
 *
 */
 public class Compte extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
   static final long serialVersionUID = 1L;
   
   @EJB FacadeMenu fmenu;
   @EJB FacadeSite fs;
   @EJB FacadeArticle fa;
   @EJB FacadeMembre fmembre;
   
    /* (non-Java-doc)
	 * @see javax.servlet.http.HttpServlet#HttpServlet()
	 */
	public Compte() {
		super();
	}   	
	
	/* (non-Java-doc)
	 * @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		//Session utilisateur
		HttpSession session = request.getSession(true);
		InfoSession infoSession = (InfoSession)session.getAttribute("infoSession");
		
		String page=request.getParameter("page");
		
		String pageInclue = "accueil.jsp";
		
		// utilisateur non connecte?
		boolean connecte = infoSession != null && infoSession.getConnecte();
		
		if(page == null || page.equals("") || page.equals("accueil")){
			pageInclue = "accueil.jsp";
		}
		else if(page.equals("connexion") && !connecte){
				pageInclue = "connexion.jsp";
		}
		else if(page.equals("deconnexion")){
			
			if(infoSession != null){
				infoSession.setConnecte(false);
			}
			session.invalidate();
			pageInclue = "accueil.jsp";
		}
		else if(page.equals("inscription") && !connecte){
				pageInclue = "inscription.jsp";
		}
		else if(page.equals("inscriptionSucces") && !connecte){
			pageInclue = "inscriptionSucces.jsp";
		}
		else if (page.equals("modificationCompte") && connecte) {
				pageInclue = "modificationCompte.jsp";
		}
		else if(page.equals("activation") && !connecte){
			
			String sId =request.getParameter("id");
			String cle=request.getParameter("cle");
			
			if(sId != null && !sId.equals("") &&
				cle != null && !cle.equals("")){
				
				try{
				
					String erreur = "";
					long id =Long.parseLong(sId);
					
					if(!this.fmembre.activation(id, cle)){
						erreur +=  "Une erreur s'est produite lors de l'activation de votre compte";
					}
						
					pageInclue = "activation.jsp";
					request.setAttribute("erreur", erreur);
				
				}catch(NumberFormatException e){
					pageInclue = "accueil.jsp";
				}
				
			}
			else{
					pageInclue = "accueil.jsp";
			}
			
		}
		else if(page.equals("redactionArticle") && connecte){
			
			// Recupère les sports afin que l'on puise les associer aux articles
			request.setAttribute("sports", fs.getSports());
			
			pageInclue = "redactionArticle.jsp";
			
		}
		else if (page.equals("creationCompetition") && connecte){
			
			// Récupere les sports dans la base donnés pour pouvoir les asocier
			// à une competition
			request.setAttribute("sports", fs.getSports());
			
			pageInclue = "creationCompetition.jsp";
			
		}
		 else if (page.equals("mesNotifications") && connecte) {
			 
			 String numPage = request.getParameter("numeroPage");
			 
			 if(numPage != null && !numPage.equals("")){
				 
				 try{
					
					int numeroPage = Integer.parseInt(numPage);
					
					// l'offset determine l'indice de l'article qui s'affiche 
					// au debut de chaque page de la pagination
					int offset = (numeroPage - 1) * Config.nbNotificationsParPage;
					Long idAuteur = infoSession.getMembre().getId();
					
					// Récuperation des notifications
					int nbNotifications = fmembre.majMembre(idAuteur).getNotifications().size();
					ArrayList<Notification> notifications = (ArrayList<Notification>) fmembre.getDernieresNotifications(idAuteur, offset,Config.nbNotificationsParPage);
					request.setAttribute("listeNotifications", notifications);
					
					// Paramètre pagination
					request.setAttribute("nbPages", (int) Math.ceil((double) nbNotifications/ Config.nbNotificationsParPage));
					
					infoSession.setMembre(fmembre.majMembre(idAuteur));
					pageInclue = "notifications.jsp";
				 }
				 catch (NumberFormatException e) {
					e.printStackTrace();
					pageInclue = "accueil.jsp";
				}
			 }
			 else{
				 
				 pageInclue = "accueil.jsp";
			 }
		} 
		else{
			pageInclue = "accueil.jsp";
		}
		
		
		
		if(pageInclue.equals("accueil.jsp")){
			
			request.getRequestDispatcher("Site?page=accueil").forward(request, response);
			
		}else{
			// Génération du menu
			request.setAttribute("idsSports", this.fs.getIdsSports());
			request.setAttribute("Menu", fmenu.getMenu());
			// Format de date utilisé sur le site (definie dans la class Config)
			request.setAttribute("formatDate", Config.sdf);
			// Session utilisateur
			request.setAttribute("infoSession", infoSession);
			// Page à inclure dans le modele 
			request.setAttribute("pageInclue", pageInclue);
			request.getRequestDispatcher("index.jsp").forward(request, response);
		}
	}  	
	
	/* (non-Java-doc)
	 * @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}   	  	    
}